# encoding=utf-8
# 服务器端
import socket
import os

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1', 9000))  # 绑定监听端口
server.listen(5)  # 监听
dirPath = "../test.xlsx"  # 文件服务器位置

print("服务器运行中···")

while True:
	conn, addr = server.accept()  # 等待连接
	print('客户端地址:', addr)  # conn连接客户端
	
	while True:
		data = conn.recv(1024)  # 接收
		if not data:  # 客户端已断开
			print('客户端断开连接')
			break
		
		print('收到的命令：', data.decode("utf-8"))
		op = ''
		try:
			op, filename = data.decode('utf-8').split(' ')
			filePath = dirPath + filename
		except:
			print('输入和文件操作无关')
		
		# 客户下载任务
		if op == 'get':
			if os.path.isfile(filePath):  # 判断文件存在
				# 1.先发送文件大小，让客户端准备接收
				size = os.stat(filePath).st_size  # 获取文件大小
				conn.send(str(size).encode('utf-8'))  # 发送数据长度
				print('发送的大小：', size)
				
				# 2.发送文件内容
				conn.recv(1024)  # 接收确认
				f = open(filePath, 'rb')
				for line in f:
					conn.send(line)  # 发送数据
				
				f.close()
			else:  # 文件不存在情况
				conn.send('文件不存在'.encode("utf-8"))
		
		# 客户上传任务
		if op == 'put':
			# 1.先接收文件长度
			server_response = conn.recv(1024)
			file_size = int(server_response.decode("utf-8"))
			print('接收到的大小：', file_size)
			
			# 2.接收文件内容
			
			filename = 'new' + filename
			filePath = dirPath + filename
			
			f = open(filePath, 'wb')
			received_size = 0
			
			while received_size < file_size:
				size = 0  # 准确接收数据大小，解决粘包
				if file_size - received_size > 1024:  # 多次接收
					size = 1024
				else:  # 最后一次接收完毕
					size = file_size - received_size
				
				filedata = conn.recv(size)  # 多次接收内容，接收大数据
				filedata_len = len(data)
				received_size += filedata_len
				print('已接收：', int(received_size / file_size * 100), "%")
				f.write(filedata)
			f.close()

server.close()
